﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Business.Entities;

namespace Data.DataBase
{
    public class PersonaAdapter : Data.Database.Adapter
    {
        private static List<Business.Entities.Persona> _Personas;

        public static List<Business.Entities.Persona> Personas
        {
            get 
            {
               if(_Personas == null)
               {
                   _Personas = new List<Persona>();
                   Persona persona;
                   
                   persona = new Persona();
                   persona.Id = 1;
                   persona.IdPlan = 1;
                   persona.Legajo = 36113;
                   persona.Apellido = "Villa flores";
                   persona.Nombre = "Marcelo";
                   persona.FechaNacimiento = new DateTime();
                   persona.Direccion = "direccion 123";
                   persona.Email = "email@mfial.com";
                   persona.Telefono = "444-444";
                   persona.TipoPersona = Persona.tiposPersonas.Alumno;
                   persona.State = Business.Entities.BusinessEntity.States.Unmodified;

                   Personas.Add(persona);

                   persona = new Persona();
                   persona.Id = 2;
                   persona.IdPlan = 1;
                   persona.Legajo = 33455;
                   persona.Apellido = "Otra";
                   persona.Nombre = "Persona";
                   persona.FechaNacimiento = new DateTime();
                   persona.Direccion = "direcion 456";
                   persona.Email = "e@gmail.com";
                   persona.Telefono = "4455-222";
                   persona.TipoPersona = Persona.tiposPersonas.Docente;
                   persona.State = Business.Entities.BusinessEntity.States.Unmodified;

                   Personas.Add(persona);
               
               }
               return PersonaAdapter._Personas; 
            }
            
        }

        public Persona GetOne(int id)
        {
            return Personas.Find(delegate(Business.Entities.Persona p) { return p.Id == id; });
        }

        public List<Persona> GetAll()
        {
            return new List<Persona>(Personas);
        }

        public void Save(Persona persona)
        {
            switch (persona.State)
            {
                case BusinessEntity.States.New:
                    int nuevoId = 0;
                    // esta busqueda podria reemplazarse por un OrderBy que orden por ID.
                    foreach (Persona per in Personas)
                    {
                        if (per.Id > nuevoId)
                        {
                            nuevoId = per.Id;
                        }
                    }
                    persona.Id = nuevoId + 1;
                    Personas.Add(persona);
                    break;
                case BusinessEntity.States.Modified:
                    Personas[Personas.FindIndex(delegate(Persona p) { return p.Id == persona.Id; })] = persona;
                    break;
                case BusinessEntity.States.Deleted:
                    this.Delete(persona);
                    break;
            }
            persona.State = BusinessEntity.States.Unmodified;
        }

        public void Delete(int id)
        {
            this.Delete(this.GetOne(id));
        }

        public void Delete(Business.Entities.Persona persona)
        {
            Personas.Remove(persona);
        }
    }
}
